package Special;

import Entities.Album;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;

/**
 *
 * @author 647_2
 */
public class SpecialAccessor {

    public static LinkedList<SpecialGenre> getCountCompositionInGenres() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8", "root", "4815162342");
        Statement statement = connection.createStatement();
        String SQLQuery = "SELECT `Жанр`.Название, COUNT(*) FROM `Связь Композиция и Жанр` JOIN `Жанр` ON `Жанр`.ID=`Связь Композиция и Жанр`.Жанр_ID GROUP BY `Связь Композиция и Жанр`.Жанр_ID";
        ResultSet result = statement.executeQuery(SQLQuery);

        LinkedList<SpecialGenre> genres = new LinkedList<SpecialGenre>();

        while (result.next()) {
            SpecialGenre temp = new SpecialGenre(result.getString(1), result.getInt(2));
            genres.add(temp);
        }

        connection.close();

        return genres;
    }

    public static LinkedList<SpecialRecording> getCountCompositionsAndAlbumsInRecording() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8", "root", "4815162342");
        Statement statement = connection.createStatement();
        Statement statement2 = connection.createStatement();
        String SQLQuery = "SELECT `Звукозаписывающая компания`.Название, `Звукозаписывающая компания`.ID, COUNT(*) FROM `Связь Альбом и Звукозаписывающая компания` JOIN `Звукозаписывающая компания` ON `Звукозаписывающая компания`.ID=`Связь Альбом и Звукозаписывающая компания`.`Звукозаписывающая компания_ID` GROUP BY `Связь Альбом и Звукозаписывающая компания`.`Звукозаписывающая компания_ID`";
        ResultSet result = statement.executeQuery(SQLQuery);

        System.out.println("Произведён запрос ЗЗК");

        LinkedList<SpecialRecording> recordings = new LinkedList<SpecialRecording>();

        while (result.next()) {
            String tname = result.getString(1);
            int tid = result.getInt(2);
            int albums = result.getInt(3);

            System.out.println("+++");

            ResultSet result2 = statement2.executeQuery("SELECT `Связь Альбом и Композиция`.Композиция_ID FROM `Связь Альбом и Композиция` JOIN `Связь Альбом и Звукозаписывающая компания` ON `Связь Альбом и Звукозаписывающая компания`.Альбом_ID=`Связь Альбом и Композиция`.Альбом_ID WHERE `Связь Альбом и Звукозаписывающая компания`.`Звукозаписывающая компания_ID`=" + tid);

            LinkedList<Integer> comps = new LinkedList<Integer>();
            int ccomps = 0;

            while (result2.next()){
                if (!comps.contains(result2.getInt(1))){
                    ccomps++;
                    comps.add(result2.getInt(1));
                }
            }

            SpecialRecording temp = new SpecialRecording(tname, albums, ccomps);
            recordings.add(temp);
        }

        connection.close();

        return recordings;
    }

    public static LinkedList<SpecialComposition> getCompositionsWithManyGenres() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8", "root", "4815162342");
        Statement statement = connection.createStatement();
        String SQLQuery = "SELECT `Композиция`.Название, COUNT(*) FROM `Связь Композиция и Жанр` JOIN `Композиция` ON `Композиция`.ID=`Связь Композиция и Жанр`.Композиция_ID GROUP BY `Связь Композиция и Жанр`.Композиция_ID HAVING COUNT(`Связь Композиция и Жанр`.Жанр_ID) > 1";
        ResultSet result = statement.executeQuery(SQLQuery);

        LinkedList<SpecialComposition> comps = new LinkedList<SpecialComposition>();

        while (result.next()) {
            SpecialComposition temp = new SpecialComposition(result.getString(1), result.getInt(2));
            comps.add(temp);
        }

        connection.close();

        return comps;
    }

    public static SpecialUser getActiveUser() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8", "root", "4815162342");
        Statement statement = connection.createStatement();
        String SQLQuery = "SELECT `Пользователь`.ID, `Пользователь`.Имя, COUNT(*) FROM `Пользователь` JOIN `Голос рейтинга` ON `Голос рейтинга`.Пользователь_ID=`Пользователь`.ID GROUP BY `Пользователь`.ID ORDER BY COUNT(*) LIMIT 1";
        ResultSet result = statement.executeQuery(SQLQuery);

        result.next();

        SpecialUser su = new SpecialUser(result.getInt(1), result.getString(2), result.getInt(3));

        connection.close();

        return su;
    }

    public static LinkedList<Album> getAlbumsByExecutorID(int eID) throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8", "root", "4815162342");
        Statement statement = connection.createStatement();
        //String SQLQuery = "SELECT `Альбом`.ID, `Альбом`.Название, `Альбом`.`Дата издания` FROM `Альбом` JOIN `Связь Исполнитель с инструментом и Альбом` ON `Связь Исполнитель с инструментом и Альбом`.Альбом_ID=`Альбом`.ID, `Исполнитель с инструментом` ON `Исполнитель с инструментом`.ID=`Связь Исполнитель с инструментом и Альбом`.`Исполнитель с инструментом_ID` WHERE `Исполнитель с инструментом_ID`.Исполнитель_ID=" + eID;
        String SQLQuery = "SELECT `Альбом`.ID, `Альбом`.Название, `Альбом`.`Дата издания` FROM `Альбом` JOIN `Связь Исполнитель с инструментом и Альбом` ON `Связь Исполнитель с инструментом и Альбом`.Альбом_ID=`Альбом`.ID JOIN `Исполнитель с инструментом` ON `Исполнитель с инструментом`.ID=`Связь Исполнитель с инструментом и Альбом`.`Исполнитель с инструментом_ID` WHERE `Исполнитель с инструментом`.Исполнитель_ID=" + eID + " GROUP BY `Альбом`.ID";
        ResultSet result = statement.executeQuery(SQLQuery);

        LinkedList<Album> albums = new LinkedList<Album>();

        while(result.next()){
            Album temp = new Album(result.getInt(1), result.getString(2), result.getDate(3));
            albums.add(temp);
        }

        connection.close();

        return albums;
    }

    public static Album getGreatableAlbum() throws SQLException, ClassNotFoundException {

        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8", "root", "4815162342");
        Statement statement = connection.createStatement();
        //String SQLQuery = "SELECT `Альбом`.ID, `Альбом`.Название, `Альбом`.`Дата издания` FROM `Альбом` JOIN `Связь Исполнитель с инструментом и Альбом` ON `Связь Исполнитель с инструментом и Альбом`.Альбом_ID=`Альбом`.ID, `Исполнитель с инструментом` ON `Исполнитель с инструментом`.ID=`Связь Исполнитель с инструментом и Альбом`.`Исполнитель с инструментом_ID` WHERE `Исполнитель с инструментом_ID`.Исполнитель_ID=" + eID;
        String SQLQuery = "SELECT `Альбом`.ID, `Альбом`.Название, `Альбом`.`Дата издания` FROM `Альбом` JOIN `Связь Альбом и Композиция` ON `Связь Альбом и Композиция`.Альбом_ID=`Альбом`.ID JOIN `Голос рейтинга` ON `Голос рейтинга`.Композиция_ID=`Связь Альбом и Композиция`.Композиция_ID GROUP BY `Альбом`.ID ORDER BY SUM(`Голос рейтинга`.`Число рейнинга`) LIMIT 1";
        ResultSet result = statement.executeQuery(SQLQuery);

        result.next();

        Album album = new Album(result.getInt(1), result.getString(2), result.getDate(3));


        connection.close();

        return album;
    }

    public static int getCountAlbumsByGroupIDAndCountryID(int gID, int cID) throws ClassNotFoundException, SQLException{
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8", "root", "4815162342");
        Statement statement = connection.createStatement();
        //String SQLQuery = "SELECT `Альбом`.ID, `Альбом`.Название, `Альбом`.`Дата издания` FROM `Альбом` JOIN `Связь Исполнитель с инструментом и Альбом` ON `Связь Исполнитель с инструментом и Альбом`.Альбом_ID=`Альбом`.ID, `Исполнитель с инструментом` ON `Исполнитель с инструментом`.ID=`Связь Исполнитель с инструментом и Альбом`.`Исполнитель с инструментом_ID` WHERE `Исполнитель с инструментом_ID`.Исполнитель_ID=" + eID;
        String SQLQuery = "SELECT COUNT(*) FROM `Звукозаписывающая компания` JOIN `Связь Альбом и Звукозаписывающая компания` ON `Связь Альбом и Звукозаписывающая компания`.`Звукозаписывающая компания_ID`=`Звукозаписывающая компания`.ID JOIN `Связь Группа и Альбом` ON `Связь Группа и Альбом`.Альбом_ID=`Связь Альбом и Звукозаписывающая компания`.Альбом_ID WHERE `Звукозаписывающая компания`.Страна_ID=" + cID + " AND `Связь Группа и Альбом`.Группа_ID=" + gID;
        ResultSet result = statement.executeQuery(SQLQuery);

        result.next();

        int count = result.getInt(1);

        connection.close();

        return count;
    }
}
